export interface ICmdProps {
  id: string; //  命令 ID，可选值为 string
  group?: ToolBarGroup; // 命令组 ID，可选值为 string
  icon?: string; // 命令图标，可选值为 string
  label?: string; // 命令名称，可选值为 string
  type?: 'context' | 'cmd' | string; // 命令类型，可选值为 context、cmd // 当变成子项的时候才有用，其他时候不需要
  button?: ToolbarButtonType; // 按钮类型，可选值为 mutualExclusion、independent
  defaultSelected?: boolean; // 是否默认选中
  initialDisabled?: boolean; // 是否默认禁用
  events?: ToolBarEvents[]; // 事件列表，可选值为 string[]
  subscribeDisabled?: (callback: (disabled: boolean) => void) => void; // 订阅命令的禁用状态变化的函数，接收一个回调函数作为参数
  subscribeSelected?: (callback: (disabled: boolean) => void) => void; // 订阅命令的禁用状态变化的函数，接收一个回调函数作为参数
  create?: (label: string, onClose: () => void) => React.ReactNode; // 创建命令组件的函数，接收 label 和 onClose 作为参数
  invoke?: (cmd) => void; // 调用命令的函数，接收命令 ID 作为参数
  callback?: (params: ToolbarInfo, ...args) => void; // 命令的函数，接收目标对象和其他参数作为参数
  exit?: () => void; // 退出命令的函数，无参数
  tips?: { title: string; description: string }; // 命令的提示信息，包含 title 和 description 属性
}

export type ToolbarInfo = {
  target: string; // 目标命令
  event: string[]; // 事件
  selected: boolean; // 是否选中
};

export enum ToolbarButtonType {
  mutualExclusion = 'mutualExclusion', // 互斥
  independent = 'independent', // 独立，
  btnClick = 'btnClick', //  button 按钮 (和按钮一样，但是没有选中状态)
} // 工具栏按钮类型，可选值为 mutualExclusion、independent 和 btnClick

export enum ToolBarGroup {
  // 拾取
  PICK = 'PICK',
  // 选择
  SELECT = 'SELECT',
  // 聚焦
  FOCUS = 'FOCUS',
  // 绘制风格
  DRAWSTYLE = 'DRAWSTYLE',
  // 几何显隐
  GEOMETRY = 'GEOMETRY',
  // 默认
  DEFAULT = 'DEFAULT',
}

export enum ToolBarEvents {
  // 禁止/启用 事件
  DIS_EN_ABLE = 'DIS_EN_ABLE',
  // 命令启用/关闭 事件
  CMD_OPEN_CLOSE = 'CMD_OPEN_CLOSE',
  FOCUS_OPEN = 'FOCUS_OPEN', // 聚焦打开
  // esc 事件
  ESC = 'ESC',
  // pick select 启用
  PICK_ENABLE = 'PICK_ENABLE',
  // 顶部tabs切换
  TAB_CHANGE = 'TAB_CHANGE',
  // first_btm_selected 选择底部第一个选择按钮
  FIRST_BTM_SELECTED = 'FIRST_BTM_SELECTED',
}

export type ToolBarCommandProps = { onClose: () => void; title?: string }; // 点命令属性类型，包含 onClose 函数
